import {  baseUrl } from "@/util/api.js"
// 获取现在时间/最近或者未来几天时间
function getDay(day) {
	var today = new Date();
	var targetday_milliseconds = today.getTime() + 1000 * 60 * 60 * 24 * day;
	today.setTime(targetday_milliseconds); //注意，这行是关键代码
	var tYear = today.getFullYear();
	var tMonth = today.getMonth();
	var tDate = today.getDate();
	tMonth = doHandleMonth(tMonth + 1);
	tDate = doHandleMonth(tDate);
	return tYear + "年" + tMonth + "月" + tDate + "日";
}

function doHandleMonth(month) {
	var m = month;
	if (month.toString().length == 1) {
		m = "0" + month;
	}
	return m;
}
// 保存图片
function saveHeadImgFile(base64, quality) {
	const bitmap = new plus.nativeObj.Bitmap("test");
	return new Promise((resolve, reject) => {
		// 从本地加载Bitmap图片
		bitmap.loadBase64Data(base64, function() {
			const url = "_doc/" + getTimeStamps() + ".png"; // url为时间戳命名方式
			bitmap.save(url, {
				overwrite: true, // 是否覆盖
				quality: quality // 图片清晰度
			}, (i) => {
				uni.saveImageToPhotosAlbum({
					filePath: url,
					success: function() {
						resolve({
							code: 0,
							msg: '保存成功',
							filePath: url
						});
					}
				});
			}, (e) => {
				reject('保存图片失败：' + JSON.stringify(e));
			});
		}, (e) => {
			reject('加载图片失败：' + JSON.stringify(e));
		});
	})
}
// 获取手机屏幕高度
function getHeight() {
	var that = this;
	uni.getSystemInfo({
		success: function(res) {
			that.fullHeight = "height:" + res.windowHeight + "px";
		}
	});
}

//手机号样式调整
function updatePhoneStyle(str) {
	// let str ='13534569890';
	let space = '&nbsp;&nbsp;&nbsp;&nbsp;';
	let newstr = str.slice(0, 3) + space + str.slice(3, 7) + space + str.slice(7, 11);
	console.log(newstr);

}

// 隐藏手机号
function hideMobile(mobile) {
	return `${mobile.slice(0,3)}****${mobile.slice(7,11)}`
}

// 定义一个深拷贝函数  接收目标target参数
function deepClone(target) {
	// 定义一个变量
	let result;
	// 如果当前需要深拷贝的是一个对象的话
	if (typeof target === 'object') {
		// 如果是一个数组的话
		if (Array.isArray(target)) {
			result = []; // 将result赋值为一个数组，并且执行遍历
			for (let i in target) {
				// 递归克隆数组中的每一项
				result.push(deepClone(target[i]))
			}
			// 判断如果当前的值是null的话；直接赋值为null
		} else if (target === null) {
			result = null;
			// 判断如果当前的值是一个RegExp对象的话，直接赋值    
		} else if (target.constructor === RegExp) {
			result = target;
		} else {
			// 否则是普通对象，直接for in循环，递归赋值对象的所有值
			result = {};
			for (let i in target) {
				result[i] = deepClone(target[i]);
			}
		}
		// 如果不是对象的话，就是基本数据类型，那么直接赋值
	} else {
		result = target;
	}
	// 返回最终结果
	return result;
}

// 
export {
	getDay, //现在到未来几天的时间
	saveHeadImgFile, //保存图片
	getHeight, //获取手机屏幕高度
	hideMobile,
	deepClone //深克隆
}

/**
 * toast 提示
 */
export const msg = (title = '', param = {}) => {
	if (!title) return;
	uni.showToast({
		title,
		duration: param.duration || 1500,
		mask: param.mask || false,
		icon: param.icon || 'none'
	});
}

/**
 * 检查登录
 * @return {Boolean}
 */
export const isLogin = (options = {}) => {
	const openid = uni.getStorageSync('openid');
	if (openid) { // 加上!先暂时表示已经登录
		return true;
	}
	// options.nav只要传的不是 false，默认跳转到登录页
	if (options.nav !== false) {
		// console.log('options.nav', options.nav)
		uni.navigateTo({
			url: '/pages/login/login.vue'
		})
	}
	return false;
}

// 节流，是否正在运行，防止多次请求
let _throttleRunning = false
/**
 * 节流
 * @param {Function} 执行函数
 * @param {Number} delay 延时ms  
 */
export const throttle = (fn, delay = 500) => {
	// 正在运行，这次结束
	if (_throttleRunning) {
		return;
	}
	//标识正在运行
	_throttleRunning = true;

	// 延时delay毫秒后运行，结束后标识运行结束
	setTimeout(() => {
		fn();
		_throttleRunning = false;
	}, delay);
}

/**
 * 获取当前页面的路由地址+参数
 */
export const routePath = () => {
	// 获取所有页面对象
	const pages = getCurrentPages();
	// 获取当前页面实例
	const page = pages[pages.length - 1];

	// 当前路由参数对象 {id: 2, name: 'xx'}
	// 在小程序或app中，使用 page.options ; H5端使用 page.$route.query
	const query = page.options || page.$route.query;
	// 将参数对象转换为 key1=value1&key2=value2形式
	let queryStr = '';
	query && Object.keys(query).forEach((key) => {
		queryStr += `${key}=${query[key]}`
	});
	// 当前路由地址+参数 pages/course/course-details.vue?key1=value1&key2=value2
	return queryStr ? `${page.route}?${queryStr}` : page.route;
}

/**
 * 校验格式数据格式
 * @param 要校验的数据
 * @param 什么类型格式
 */
export const checkStr = (str, type) => {
	switch (type) {
		case 'mobile': //手机号码
			return /^1[3|4|5|6|7|8|9][0-9]{9}$/.test(str);
		case 'tel': //座机
			return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str);
		case 'card': //身份证
			return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(str);
		case 'mobileCode': //6位数字验证码
			return /^[0-9]{6}$/.test(str)
		case 'pwd': //密码以字母开头，长度在6~18之间，只能包含字母、数字和下划线
			return /^([a-zA-Z0-9_]){6,18}$/.test(str)
		case 'payPwd': //支付密码 6位纯数字
			return /^[0-9]{6}$/.test(str)
		case 'postal': //邮政编码
			return /[1-9]\d{5}(?!\d)/.test(str);
		case 'QQ': //QQ号
			return /^[1-9][0-9]{4,9}$/.test(str);
		case 'weixin': //微信号
			return /^[a-zA-Z][a-zA-Z\d_-]{5,19}$/.test(str);
		case 'email': //邮箱
			return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str);
		case 'money': //金额(小数点2位)
			return /^\d*(?:\.\d{0,2})?$/.test(str);
		case 'URL': //网址
			return /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(str)
		case 'IP': //IP
			return /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(str);
		case 'date': //日期时间
			return /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(str) ||
				/^(\d{4})\-(\d{2})\-(\d{2})$/
				.test(str)
		case 'number': //数字
			return /^[0-9]$/.test(str);
		case 'english': //英文
			return /^[a-zA-Z]+$/.test(str);
		case 'chinese': //中文
			return /^[\\u4E00-\\u9FA5]+$/.test(str);
		case 'lower': //小写
			return /^[a-z]+$/.test(str);
		case 'upper': //大写
			return /^[A-Z]+$/.test(str);
		case 'HTML': //HTML标记
			return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str);
		case 'age': //QQ号
			// return /^[1-9][0-9]{1}$/.test(str); /*  */
			return /^([1-9]\d?|1[01]\d|120)$/.test(str);

		default:
			return true;
	}
}

/**
 * @desc 格式化日期字符串
 * @param { Nubmer} - Date日期 , 时间不能大于当前时间，大于当前时间会返回“刚刚”。
 * @returns { String } 格式化后的日期字符串
     // 2012年01月10日 12:46
     //刚刚
    //16分钟前
    //今天10:10
    //昨天10:10
    //02月10日 10:10:11
    //2012年10月10日 10:10:11
 */
export const dateFormat = (date) => {
	if (!date) return ''
	//new Date 在 ios safari浏览器有兼容性问题处理如下：ios不支持2027-2-22 16:23，需要改为2027/2/22 16:23 
	// ? 兼容 ios safari : 兼容其他浏览器
	let $this = new Date(date) == 'Invalid Date' ? new Date(date.replace(/-/g, "/")) : new Date(date)
	var timestamp = parseInt(Date.parse($this)) / 1000 //- 8 * 60 * 60; //（本地时间）东八区减去8小时;

	function zeroize(num) {
		return (String(num).length == 1 ? '0' : '') + num;
	}
	var curTimestamp = parseInt(new Date().getTime() / 1000); //当前时间戳
	var timestampDiff = curTimestamp - timestamp; // 参数时间戳与当前时间戳相差秒数
	var curDate = new Date(curTimestamp * 1000); // 当前时间日期对象
	var tmDate = new Date(timestamp * 1000); // 参数时间戳转换成的日期对象

	var Y = tmDate.getFullYear(),
		m = tmDate.getMonth() + 1,
		d = tmDate.getDate();
	var H = tmDate.getHours(),
		i = tmDate.getMinutes(),
		s = tmDate.getSeconds();


	if (timestampDiff < 60) { // 一分钟以内
		return "刚刚";
	} else if (timestampDiff < 3600) { // 一小时前之内
		return Math.floor(timestampDiff / 60) + "分钟前";
	} else if (curDate.getFullYear() == Y && curDate.getMonth() + 1 == m && curDate.getDate() == d) {
		return '今天 ' + zeroize(H) + ':' + zeroize(i) + ':' + zeroize(s);
	} else {
		var newDate = new Date((curTimestamp - 86400) * 1000); // 参数中的时间戳加一天转换成的日期对象
		if (newDate.getFullYear() == Y && newDate.getMonth() + 1 == m && newDate.getDate() == d) {
			return '昨天 ' + zeroize(H) + ':' + zeroize(i) + ':' + zeroize(s);
		} else if (curDate.getFullYear() == Y) {
			// return  zeroize(m) + '月' + zeroize(d) + '日 ' + zeroize(H) + ':' + zeroize(i) + ':' + zeroize(s);
			return zeroize(m) + '月' + zeroize(d) + '日';
		} else {
			// return  Y + '年' + zeroize(m) + '月' + zeroize(d) + '日 ' + zeroize(H) + ':' + zeroize(i) + ':' + zeroize(s);
			return Y + '年' + zeroize(m) + '月' + zeroize(d) + '日';
		}
	}
}
/**
 * @param {format} 转换后的日期格式，默认yyyy-MM-dd hh:mm:ss
 */
export function format(date, format = "yyyy-MM-dd hh:mm:ss") {
	if (!date) return ''
	//new Date 在 ios safari浏览器有兼容性问题处理如下：
	// ? 兼容safari : 兼容其他浏览器
	let $this = new Date(date) == 'Invalid Date' ? new Date(date.substr(0, 19)) : new Date(date)

	let o = {
		'M+': $this.getMonth() + 1,
		'd+': $this.getDate(),
		'h+': $this.getHours(),
		'm+': $this.getMinutes(),
		's+': $this.getSeconds(),
		'q+': Math.floor(($this.getMonth() + 3) / 3),
		'S': $this.getMilliseconds()
	}
	if (/(y+)/.test(format)) {
		format = format.replace(RegExp.$1, ($this.getFullYear() + '').substr(4 - RegExp.$1.length))
	}
	for (var k in o) {
		if (new RegExp('(' + k + ')').test(format)) {
			format = format.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k])
				.length)))
		}
	}
	return format
}


// 粘贴板
export const getCopys = function(content) {
	if (!content) return uni.showToast({
		title: '复制的内容不能为空 !',
		icon: 'none'
	})
	content = typeof content === 'string' ? content : content.toString() // 	复制内容，必须字符串，数字需要转换为字符串
	/**
	 * 小程序端 和 app端的复制逻辑
	 */
	//#ifndef H5
	uni.setClipboardData({
		data: content,
		success: function() {
			uni.showToast({
				title: '复制成功~',
				icon: 'none'
			})
		},
		fail: function() {
			uni.showToast({
				title: '复制失败~',
				icon: 'none'
			})
		}
	});
	//#endif

	/**
	 * H5端的复制逻辑
	 */
	// #ifdef H5
	if (!document.queryCommandSupported('copy')) { //为了兼容有些浏览器 queryCommandSupported 的判断
		// 不支持
		uni.showToast({
			title: '浏览器不支持',
			icon: 'none'
		})
	}
	let textarea = document.createElement("textarea")
	textarea.value = content
	textarea.readOnly = "readOnly"
	document.body.appendChild(textarea)
	textarea.select() // 选择对象
	textarea.setSelectionRange(0, content.length) //核心
	let result = document.execCommand("copy") // 执行浏览器复制命令
	if (result) {
		uni.showToast({
			title: '复制成功~',
			icon: 'none'
		})
	} else {
		error("复制失败，请检查h5中调用该方法的方式，是不是用户点击的方式调用的，如果不是请改为用户点击的方式触发该方法，因为h5中安全性，不能js直接调用！")
	}
	textarea.remove()
	// #endif
}

// 图片上传
//  arr图片数组
//  showAdd控制上传按钮是否显示的变量

export const uploadImg = function(arr, showAdd, length = 9) {
	let that = this;
	uni.chooseImage({
		count: 9 - arr.length, //默认9
		sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图，默认二者都有
		sourceType: ['album', 'camera'], //album从相册选择 //camera拍照上传
		success: res => {
			uni.showLoading({
				title: '图片上传中'
			});
			let l = arr.length;
			res.tempFilePaths.forEach((item, index) => {
				// console.log(item)
				uni.uploadFile({
					url: `${baseUrl}upload/image/field`, //上传图片接口地址
					filePath: item,
					name: 'field',
					formData: {
					      'filename': 'field'
					 },
					header: {
						"X-Token": "Bearer " + uni.getStorageSync('token'),
				 	    "Content-Type": "multipart/form-data",
					},
					success: uploadFileRes => {
						console.log(JSON.parse(uploadFileRes.data).data)
						arr.push(JSON.parse(uploadFileRes.data).data);
						if (index == res.tempFilePaths.length - 1) {
							uni.hideLoading();
							uni.showToast({
								title: '上传成功',
								icon: 'none'
							})
						}
						if (arr.length > length - 1) {
							that.showAdd = false;
						}
					},
					fail() {
						uni.showToast({
							title: '上传失败',
							icon: 'none'
						})
					}
				})
			})
		}
	});
}

export function uploadMedia(arr, showAdd, length = 9) {
	uni.chooseMedia({
		count: length,
		mediaType: ['image', 'video'],
		sourceType: ['album', 'camera'],
		maxDuration: 30,
		camera: 'back',
		success(res) {
			console.log(res)
			uni.showLoading({
				title: '文件上传中'
			});
			res.tempFiles.forEach((item, index) => {
				uni.uploadFile({
					url: 'https://www.example.com/upload', //上传图片接口地址
					filePath: item.tempFilePath,
					name: 'file',
					success: uploadFileRes => {

						let data = JSON.parse(uploadFileRes.data);
						console.log(data);
						// arr.push(JSON.parse(uploadFileRes.data).data);
						uni.hideLoading();
						uni.showToast({
							title: data.message,
							icon: 'none'
						})
						if (data.code == 1) {


						}
						// if (arr.length > length - 1) {
						// 	that.showAdd = false;
						// }
					},
					fail() {
						uni.showToast({
							title: '上传失败',
							icon: 'none'
						})
					}
				})
			})
		}
	})
}
// 倒计时--列表
export const countTime = function(list, time, name) { //list数组 time:传入的时间属性名，name倒计时属性名

	// this.$set(list[index],name,0);//给定name初始值
	//定义变量,h,m,s保存倒计时的时间
	let _this = this;
	var h, m, s;
	if (list.length > 0) { //列表倒计时
		list.forEach((item, index) => {
			var now = new Date().getTime();
			var end = new Date(item[time]).getTime();
			//时间差
			var differTime = (end - now) / 1000;
			var timer = setInterval(() => {
				differTime--;
				if (differTime >= 0) {
					h = Math.floor(differTime / 60 / 60);
					m = Math.floor(differTime / 60 % 60);
					s = Math.floor(differTime % 60);
					h = h < 10 ? ("0" + h) : h;
					m = m < 10 ? ("0" + m) : m;
					s = s < 10 ? ("0" + s) : s;
					var timeDom = h + ": " + m + ": " + s;
					this.$set(list[index], name, timeDom)
				} else {
					// 活动结束
					this.$set(list[index], name, 0)
					clearInterval(timer)
				}
			}, 1000)
		})
	} else { //单个倒计时
		var now = new Date().getTime();
		var end = new Date(time).getTime();

		//时间差
		var differTime = (end - now) / 1000;
		var timer = setInterval(() => {
			differTime--;
			if (differTime >= 0) {
				h = Math.floor(differTime / 60 / 60);
				m = Math.floor(differTime / 60 % 60);
				s = Math.floor(differTime % 60);
				h = h < 10 ? ("0" + h) : h;
				m = m < 10 ? ("0" + m) : m;
				s = s < 10 ? ("0" + s) : s;
				_this[name] = h + ": " + m + ": " + s;

			} else {
				// 活动结束
				clearInterval(timer)
			}
		}, 1000)
	}

}
// 
// 倒计时-分秒
export const countTime2 = function(value = '2022-02-15 09:40', index) {
	// 倒计时=失效时间-当前时间
	let m = 0,
		s = 0;
	let Overtime = new Date(value.replace(/-/g, "/"));
	let currentDate = new Date(); //获取当前时间
	let disDate = (Overtime - currentDate); //相差时间毫秒数
	if (disDate < 0) {
		return '';
		// 发送请求取消订单
	}
	// 剩余分钟
	m = Math.floor(disDate / 1000 / 60);
	s = Math.floor(disDate / 1000 % 60);
	m = m < 10 ? ("0" + m) : m;
	s = s < 10 ? ("0" + s) : s;
	return m + ':' + s
}
export const showToast = function(title, time = 1500) {
	return uni.showToast({
		title,
		icon: 'none',
		duration: time
	})
}

// 数组切割
export const group = function(array, subGroupLength) {
	let index = 0;
	let newArray = [];
	while (index < array.length) {
		newArray.push(array.slice(index, index += subGroupLength));
	}
	return newArray;
}
